#include "ADC.h"
#include "GPIO.h"
#include "Delay.h"
#include "UART.h"
#include "NVIC.h"
#include "Switch.h"

#define TASK_MAIN 		0 
#define TASK_CARBON     1

#define CALIBRATION_A 703.24  // 校准常数A，基于你的实验数据
#define CALIBRATION_B 0.1   // 基准电压B，基于你的实验数据
/*我们使用了你提供的实验数据（0.62V 和 0.70V 对应的 CO2 浓度）来 校准常数 A 和 B。
通过计算，我们得出了新的公式：
CO2浓度
 (ppm)=1209.75×(V?0.118)*/
// Function prototype for calculate_CO2_concentration
float calculate_CO2_concentration(float voltage);

void Carbon_GPIO_Config(void) {
	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_4;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_HighZ;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P0, &GPIO_InitStructure);//初始化
}

void ADC_Config(){
	
	ADC_InitTypeDef init;
	
	init.ADC_SMPduty = 31;		//ADC 模拟信号采样时间控制, 0~31（注意： SMPDUTY 一定不能设置小于 10）
	init.ADC_Speed = ADC_SPEED_2X1T;			//设置 ADC 工作时钟频率	ADC_SPEED_2X1T~ADC_SPEED_2X16T
	init.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;	//ADC结果调整,	ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
	init.ADC_CsSetup = 0 ;		//ADC 通道选择时间控制 0(默认),1
	init.ADC_CsHold = 1;			//ADC 通道选择保持时间控制 0,1(默认),2,3
	
	ADC_Inilize(&init);
	
	ADC_PowerControl(ENABLE);
}


float calculate_CO2_concentration(float voltage) {
    // 使用校准的线性公式：CO2浓度 = A * (V - B)
    if (voltage > CALIBRATION_B) {
        return CALIBRATION_A * (voltage - CALIBRATION_B);
    }
    return 0;  // 如果电压太低，返回0ppm
}

void Carbon_Init(){
    Carbon_GPIO_Config();
	ADC_Config();
}
u16 adc_result;
float ntc_v,co2_concentration;
float Carbon_Get(){
    // 1. 通过ADC获取测量值
        adc_result = Get_ADCResult(ADC_CH12);  // 假设MQ-135连接在ADC通道12
//        printf("ADC result: %d\n", adc_result);

        // 2. 通过测量值获取电压值
        ntc_v = adc_result * 5.0 / 4096;  // 12位ADC，最大值4095，参考电压5V
//       printf("Calculated Voltage: %.2fV\n", ntc_v);
        // 3. 根据电压值计算CO2浓度
        co2_concentration = calculate_CO2_concentration(ntc_v);
//        printf("Calculated CO2 Concentration: %.2f ppm\n", co2_concentration);

        return co2_concentration;
        

}